home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Plus 2004 #2
/
Amiga Plus CD - 2004 - No. 02.iso
/
AmiSoft
/
Disk
/
moni
/
FileX-src.lha
/
FileX-src
/
cursor.c
< prev
next >
Wrap
C/C++ Source or Header
|
2003-10-21
|
9KB
|
446 lines
#include "allprotos.h"
#include "FileXStructs.h"
void CursorMarkOn( struct DisplayData *DD )
{
if( DD->Flags & DD_MARK )
MarkOn( DD );
else
CursorOn( DD );
}
void CursorMarkOff( struct DisplayData *DD )
{
if( DD->Flags & DD_MARK )
MarkOff( DD );
else
CursorOff( DD );
}
void ExpandBlock( long x1, long x2, struct DisplayData *DD )
{
long s1, s2;
x1 -= DD->SPos * DD->BPR;
x2 -= DD->SPos * DD->BPR;
if( x1 < x2 )
{
s1 = x1;
s2 = x2;
}
else
{
s1 = x2;
s2 = x1;
}
SetAPen( DD->Wnd->RPort, BlockAPen );
SetBPen( DD->Wnd->RPort, BlockBPen );
DisplayPart( s1, s2, DD );
}
void ShrinkBlock( long x1, long x2, struct DisplayData *DD )
{
long s1, s2;
x1 -= DD->SPos * DD->BPR;
x2 -= DD->SPos * DD->BPR;
if( x1 < x2 )
{
s1 = x1;
s2 = x2;
}
else
{
s1 = x2;
s2 = x1;
}
SetAPen( DD->Wnd->RPort, NormalAPen );
SetBPen( DD->Wnd->RPort, NormalBPen );
DisplayPart( s1, s2, DD );
}
/*
* void SetCursor( long Pos, struct DisplayData *DD )
*
* Setzt den Cursor an die Stelle Pos(in Bytes). Der Cursor muß schon
* irgendwo anders stehen.
*/
void SetCursor( long Pos, struct DisplayData *DD )
{
/* Printf("SetCursor(%ld) %ld,\n", Pos, DD->CPos);*/
if( DD->FD->Len == 0 ) return;
/* HexEditPos auf obere 4Bits setzten */
DD->Flags &= ~DD_HEXEDITPOS;
/* Von Pos = 0 ins negative =>nichts machen */
if(( DD->CPos == 0 ) && ( Pos < 0 )) return;
/* Cursor nach hinten und stehen wir in der letzten Zeile? */
if(( Pos > DD->CPos ) && (( DD->CPos / DD->BPR ) == ( DD->FD->Len / DD->BPR )))
{
/* Soll der Cursor an das Ende der Zeile? */
/* Wenn ja, dann Cursor an das Ende des Files setzen */
/* Wenn nein und der Cursor außerhalb stehen soll, abbrechen */
if( Pos % DD->BPR == DD->BPR - 1 )
Pos = DD->FD->Len - 1;
else
if( Pos >= DD->FD->Len )
return;
}
/* Falls der Cursor nicht im Filebereich, anpassen */
if( Pos < 0 )
Pos = ( Pos + DD->BPR * DD->Zeilen ) % DD->BPR;
else
if( Pos >= DD->FD->Len )
{
if( DD->FD->Len % DD->BPR <= Pos % DD->BPR )
Pos = Pos % DD->BPR + ( DD->FD->Len / DD->BPR - 1 ) * DD->BPR;
else
Pos = Pos % DD->BPR + DD->FD->Len / DD->BPR * DD->BPR;
}
/* Gleiche Position und keine Verschiebung => abbrechen */
if( Pos == DD->CPos )
if((( Pos >= DD->SPos * DD->BPR + DD->ScrollRand * DD->BPR ) &&
( Pos < ( DD->SPos + DD->Zeilen - DD->ScrollRand ) * DD->BPR )) ||
( Pos < DD->ScrollRand * DD->BPR ) ||
( Pos > ( DD->FD->Len - DD->ScrollRand * DD->BPR )))
return;
/* Im Markierungsmodus dieses Ex-Riesenbaby abarbeiten */
/* Version 2.1: Total geändert und wieder länger!! */
if( DD->Flags & DD_MARK )
{
long PosZeile = Pos / DD->BPR;
/* Falls neue CursorPos außerhalb, in den neuen Bereich scrollen */
if( PosZeile < DD->SPos + DD->ScrollRand )
{
long diff = PosZeile - ( DD->SPos + DD->ScrollRand );
if( DD->SPos + diff < 0 )
diff = -DD->SPos;
#ifdef DEBUG
PutStr("SetCursor: scrolling up\n");
Printf("Diff = %ld\n", diff );
#endif
if((!diff)||( -diff > DD->Zeilen ))
{
DD->SPos += diff;
DD->CPos = Pos;
RedrawDisplay( DD );
}
else
{
long tp = Pos;
if( tp < DD->SPos * DD->BPR )
tp = DD->SPos * DD->BPR;
if( tp >= DD->MPos )
{
if( tp != Pos ) tp--;
ShrinkBlock( DD->CPos, tp + 1, DD );
}
else if( DD->CPos <= DD->MPos )
{
// ExpandBlock( tp, DD->CPos - 1, DD );
ExpandBlock( tp, DD->CPos, DD );
}
else
{
ShrinkBlock( DD->CPos, DD->MPos + 1, DD );
ExpandBlock( DD->MPos - 1, tp, DD );
}
DD->SPos += diff;
DD->CPos = Pos;
MoveDisplay( diff, DD );
RedrawPart( 0, - diff - 1, DD );
SetScrollerGadget( DD );
}
}
else if( PosZeile >= DD->SPos + DD->Zeilen - DD->ScrollRand )
{
long diff = PosZeile - ( DD->SPos + DD->Zeilen - DD->ScrollRand - 1 );
long ZeilenImFile = ( DD->FD->Len + DD->BPR - 1 ) / DD->BPR;
#ifdef DEBUG
PutStr("SetCursor: scrolling down\n");
Printf("Diff = %ld\n", diff );
#endif
if( DD->SPos + diff + DD->Zeilen > ZeilenImFile )
{
if( ZeilenImFile < DD->Zeilen )
{
diff = 0;
}
else
{
diff = ZeilenImFile - ( DD->SPos + DD->Zeilen );
}
}
if((!diff)||( diff > DD->Zeilen ))
{
DD->SPos += diff;
DD->CPos = Pos;
RedrawDisplay( DD );
}
else
{
long tp = Pos;
if( tp >= ( DD->SPos + DD->Zeilen ) * DD->BPR )
tp = ( DD->SPos + DD->Zeilen ) * DD->BPR - 1;
if( tp <= DD->MPos )
{
if( tp != Pos ) tp++;
ShrinkBlock( DD->CPos, tp - 1, DD );
}
else if( DD->CPos >= DD->MPos )
{
// ExpandBlock( tp, DD->CPos + 1, DD );
ExpandBlock( tp, DD->CPos, DD );
}
else
{
ShrinkBlock( DD->CPos, DD->MPos - 1, DD );
ExpandBlock( DD->MPos + 1, tp, DD );
}
DD->SPos += diff;
DD->CPos = Pos;
MoveDisplay( diff, DD );
RedrawPart( DD->Zeilen - diff, DD->Zeilen - 1, DD );
SetScrollerGadget( DD );
}
}
else
{
#ifdef DEBUG
PutStr("SetCursor: all conditions failed\n");
#endif
/* Es fand keine Verschiebung statt, wir müssen aber */
/* den Block erweitern oder kürzen */
if( DD->CPos == DD->MPos )
{
#ifdef DEBUG
PutStr("SetCursor: DD->CPos == DD->MPos\n");
#endif
if( Pos < DD->CPos )
{
ExpandBlock( DD->CPos - 1, Pos, DD );
}
else
{
ExpandBlock( DD->CPos + 1, Pos, DD );
}
}
else if( DD->CPos > DD->MPos )
{
#ifdef DEBUG
PutStr("SetCursor: DD->CPos > DD->MPos\n");
#endif
if( Pos > DD->CPos )
{
// ExpandBlock( DD->CPos + 1, Pos, DD );
ExpandBlock( DD->CPos, Pos, DD );
}
else if( Pos >= DD->MPos )
{
ShrinkBlock( DD->CPos, Pos + 1, DD );
}
else
{
ShrinkBlock( DD->MPos + 1, DD->CPos, DD );
ExpandBlock( DD->MPos - 1, Pos, DD );
}
}
else
{
#ifdef DEBUG
PutStr("SetCursor: DD->CPos < DD->MPos\n");
#endif
if( Pos < DD->CPos )
{
// ExpandBlock( DD->CPos - 1, Pos, DD );
ExpandBlock( DD->CPos, Pos, DD );
}
else if( Pos <= DD->MPos )
{
ShrinkBlock( DD->CPos, Pos - 1, DD );
}
else
{
ShrinkBlock( DD->MPos - 1, DD->CPos, DD );
ExpandBlock( DD->MPos + 1, Pos, DD );
}
}
DD->CPos = Pos;
}
}
else
{
long PosZeile = Pos / DD->BPR;
CursorOff( DD );
/* Falls eine Verschiebung überhaupt möglich ist */
if( DD->FD->Len > DD->Zeilen * DD->BPR )
{
/* Falls Cursor im unteren oder oberen DD->ScrollRand steht, */
/* Display verschieben */
if( PosZeile < DD->SPos + DD->ScrollRand )
{
long diff = PosZeile - ( DD->SPos + DD->ScrollRand );
if( DD->SPos + diff < 0 )
diff = -DD->SPos;
#ifdef DEBUG
Printf("Diff=%ld, PosZeile=%ld\n", diff, PosZeile );
#endif
DD->SPos += diff;
DD->CPos = Pos;
if( diff )
if( -diff > DD->Zeilen )
{
RedrawDisplay( DD );
}
else
{
MoveDisplay( diff, DD );
RedrawPart( 0, - diff - 1, DD );
SetScrollerGadget( DD );
}
}
else
if( Pos >= ( DD->SPos + DD->Zeilen - DD->ScrollRand ) * DD->BPR )
{
long diff = PosZeile - ( DD->SPos + DD->Zeilen - DD->ScrollRand - 1 );
long ZeilenImFile = ( DD->FD->Len + DD->BPR - 1 ) / DD->BPR;
#ifdef DEBUG
Printf("Diff=%ld, PosZeile=%ld\n", diff, PosZeile );
#endif
if( DD->SPos + diff + DD->Zeilen > ZeilenImFile )
{
if( ZeilenImFile < DD->Zeilen )
{
diff = 0;
}
else
{
diff = ZeilenImFile - ( DD->SPos + DD->Zeilen );
}
}
DD->SPos += diff;
DD->CPos = Pos;
if( diff )
if( diff > DD->Zeilen )
{
RedrawDisplay( DD );
}
else
{
MoveDisplay( diff, DD );
RedrawPart( DD->Zeilen - diff, DD->Zeilen - 1, DD );
SetScrollerGadget( DD );
}
}
}
DD->CPos = Pos;
// CursorOn( DD );
}
UpdateStatusZeile( DD );
CursorOn(DD);
}
void __inline MoveCursorX( WORD Steps, struct DisplayData *DD )
{
SetCursor( DD->CPos + Steps, DD );
}
void __inline MoveCursorY( WORD Steps, struct DisplayData *DD )
{
if( DD->CPos + DD->BPR * Steps < 0 ) SetCursor( DD->CPos % DD->BPR, DD );
else SetCursor( DD->CPos + DD->BPR * Steps, DD );
}
void __inline SetCursorX( WORD Pos, struct DisplayData *DD )
{
SetCursor( DD->CPos / DD->BPR + Pos, DD );
}
void __inline SetCursorY( WORD Pos, struct DisplayData *DD )
{
SetCursor( DD->CPos % DD->BPR + Pos * DD->BPR, DD );
}
void __inline SetCursorStart( struct DisplayData *DD )
{
SetCursor( 0, DD );
SetScrollerGadget(DD);
}
void __inline SetCursorEnd( struct DisplayData *DD )
{
SetCursor( DD->FD->Len - 1, DD );
SetScrollerGadget(DD);
}
void __inline SetCursorStartOfLine( struct DisplayData *DD )
{
SetCursor( DD->CPos / DD->BPR * DD->BPR, DD );
}
void __inline SetCursorEndOfLine( struct DisplayData *DD )
{
SetCursor( DD->CPos / DD->BPR * DD->BPR + DD->BPR - 1, DD );
}
void __inline SetCursorAltLeft( struct DisplayData *DD )
{
if( DD->DisplaySpaces != 8 )
SetCursor((( DD->CPos - 1 ) & ( ~(( 1L << DD->DisplaySpaces ) - 1 ))), DD );
else
SetCursorStartOfLine( DD );
}
void __inline SetCursorAltRight( struct DisplayData *DD )
{
if( DD->DisplaySpaces != 8 )
SetCursor(( DD->CPos & ( ~(( 1L << DD->DisplaySpaces ) - 1 ))) + ( 1L << DD->DisplaySpaces ), DD );
else
SetCursorEndOfLine( DD );
}